package server

import (
	"context"
	"strings"

	"gitee.com/xiaoyutab/xgotool/xstring"
	"google.golang.org/grpc/peer"
)

// IP信息获取
type IP struct {
	Network string `json:"network"` // 协议类型 tcp / udp
	Ip      string `json:"ip"`      // IP地址 x.x.x.x / x:x:x:X
	IsIpv4  bool   `json:"is_ipv4"` // 是否为IPV4地址
	Port    int    `json:"port"`    // 端口号
}

// 获取GRPC请求的客户端IP信息
//
//	ctx	客户端请求体
func ClientIp(ctx context.Context) *IP {
	ips := IP{}
	if p, ok := peer.FromContext(ctx); ok {
		ips.Network = p.Addr.Network()
		ip := p.Addr.String()
		if strings.ContainsAny(ip, "[") {
			// 是IPV6地址
			sts := strings.Split(ip, "]:")
			ips.Ip = sts[0][1:]
			if len(sts) > 1 {
				ips.Port = xstring.ToInt(sts[1])
			}
		} else {
			ips.IsIpv4 = true
			sts := strings.Split(ip, ":")
			ips.Ip = sts[0]
			if len(sts) > 1 {
				ips.Port = xstring.ToInt(sts[1])
			}
		}
	}
	return &ips
}
